package p1search;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Version;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class TestUtils {
    private SearchUtils searchUtils;
    @Before
    public void setUp(){
        searchUtils =new SearchUtils();
    }

    /**
     * 精确匹配
     * @throws IOException
     */
    @Test
    public void searchByTerm() throws IOException {
        //疑问，如果改为 is 就查不到了，跟分词有关？  是的跟跟分词有关，is 是停用词
        searchUtils.searchByTerm("content","aa",3);
    }

    /**
     * 范围查询 不包数字
     * @throws IOException
     */
    @Test
    public void searchByTermRange() throws IOException {
       // searchUtils.searchByTermRange("id","1","3",3);
        //也可以根据姓名范围查询，(疑问，这个范围究竟是怎么排序的)
        //顺序不能写反了
        searchUtils.searchByTermRange("name","s","z",3);
        //如果是数字类型的话用termRange就没法查
        //searchUtils.searchByTermRange("atache","1","5",3);
    }

    /**
     * 范围查询，查数字
     * @throws IOException
     */
    @Test
    public void searchByNumericRange() throws IOException {
        //可以看到按数字查询没有排序，不过我们也可以排序
        searchUtils.searchByNumericRange("atache",1,3,3);
    }

    /**
     * 前缀搜索
     * @throws IOException
     */
    @Test
    public void prefixQuery() throws IOException {
        //searchUtils.prefixQuery("name","z",3);
        //疑问，好像是根据分词好每一个词来匹配的
        searchUtils.prefixQuery("content","w",3);
    }

    /**
     * 通配符搜索
     * ?表单个字符，* 表多个字符
     * @throws IOException
     */
    @Test
    public void wildCardQuery() throws IOException {

        //searchUtils.wildCardQuery("name","*a",3);
        searchUtils.wildCardQuery("content","*a*",3);
    }

    /**
     *可以连接多个条件
     * @throws IOException
     */
    @Test
    public void booleanQuery() throws IOException {
        searchUtils.booleanQuery(10);
    }

    /**
     * 短语查询
     * @throws IOException
     */
    @Test
    public void pharseQuery() throws IOException {
        //疑问，同searchByTerm，如果改为 is（is,每个文档都有） 就查不到了，跟分词有关？
        //searchByTerm
        // 这里源是大写，如果查询是大写的话就查不出，查询是小写的话就能查出？
        //疑问 会自动转化成小写？
        searchUtils.pharseQuery(10);
    }

    /**
     * 模糊查询，英文的话错一个字符也能查出来
     * @throws IOException
     */
    @Test
    public void fuzzyQuery() throws IOException {
        //可以通过参数调整相似度
        searchUtils.fuzzyQuery(10);
    }

    @Test
    public void searchByQueryParse() throws ParseException, IOException {
        //默认搜索域为content,可以修改
        QueryParser parse=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
        Query query=parse.parse("zhangsan");
        //空格   默认是or  "lisi zhangsan"表示李四或者张三,也可以用参数 "lissi and zhangsan"
        //可以修改默认操作符
        //parse.setDefaultOperator(QueryParser.Operator.AND);
        //也可以改变搜索域 name 为zhangsan的（就是可以改变查哪个字段）
        //query=parse.parse("name:zhangsan");
        //也可以使用通配符
        //query=parse.parse("name:zhang*");
        //第一个字符是通配符的不能查因为效率较低，所以默认关闭，也可以开启
        //query=parse.parse("name:*zhang");
        //parse.setAllowLeadingWildcard(true);
        query=parse.parse("lisi zhangsan");
        searchUtils.searchByQueryParse(query,3);
    }
}
